/*
#define S_IRWXU 00700  文件User具有RWX权限
#define S_IRUSR 00400  文件User具有R权限
#define S_IWUSR 00400  文件User具有W权限
#define S_IXUSR 00400  文件User具有X权限

#define S_IRWXG 00070   文件Group具有RWX权限
#define S_IRGRP 00040   文件Group具有R权限
......

#define S_IRWXO 00007   Others具有RWX权限
#define S_IROTH 00004   Others具有R权限
......

一般使用下面这些：
#define S_IRWXUGO  (S_IRWXU|S_IRWXG|S_IRWXO) UGO:user+group+others
#define S_IALLUGO  (同上)
#define S_IRUGO    UGO有R权限
#define S_IWUGO    UGO有W权限
#define S_IXUGO    UGO有X权限
*/

//usage: insmod module_param.ko a=1 array=1,2,3 str1=wangzhinan
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>

static int a = 0;
// 接收参数
module_param(a, int, S_IRUGO);
//描述参数信息
MODULE_PARM_DESC(a,"eg: a=1");

static int array[5] = {0};
static int array_size;
module_param_array(array, int, &array_size, S_IRUGO);
MODULE_PARM_DESC(array, "eg: array=1,2,3");

static char str1[10]={0};
module_param_string(str1, str1, sizeof(str1), S_IRUGO);
MODULE_PARM_DESC(str1, "eg: string=wangzhinan");

static int module_param_init(void)
{
    /*
    在 C90 标准里，变量声明必须放在代码块的开头，也就是在任何执行语句之前。
    要是编译器严格遵循 C90 标准，那么在 printk("a is %d!\n", a); 这条执行语句之后声明 int i; 就会产生错误。
    */
    int i;
    printk("a is %d!\n", a);
    for (i = 0; i < array_size; ++i) {
        printk("array[%d]:%d  ", i, array[i]);
    }
    printk("\n");

    printk("str1: %s\n", str1);
    
    return 0;
}
static void module_param_exit(void)
{
    printk("module_param exit!\n");
}

module_init(module_param_init);
module_exit(module_param_exit);
// 遵守GPL协议
MODULE_LICENSE("GPL");

MODULE_AUTHOR("wangzhinan");
MODULE_VERSION("V1.0");

